﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleData.Infrastructure.Serialization
{
	/// <summary>
	/// Define como será feita a serialização e deserialização dos objetos
	/// </summary>
	public interface IDataObjectStreamer
	{
		/// <summary>
		/// Realiza a serialização do valor <paramref name="value"/>.
		/// </summary>
		/// <param name="value"></param>
		/// <returns></returns>
		byte[] Serialize( object value );

		/// <summary>
		/// Realiza a deserialização
		/// </summary>
		/// <param name="value"></param>
		/// <returns></returns>
		object Deserialize( byte[] value );
		
		/// <summary>
		/// Realiza a deserialização :)
		/// </summary>
		/// <typeparam name="TValue"></typeparam>
		/// <param name="value"></param>
		/// <returns></returns>
		//TValue DeserializeAs<TValue>( byte[] value );
	}

	/// <summary>
	/// 
	/// </summary>
	public static class DataObjectStreamerExtensions
	{
		public static TValue DeserializeAs<TValue>( this IDataObjectStreamer streamer, byte[] value )
		{
			if ( streamer == null || value == null || value.Length == 0 )
				return default( TValue );
			else
				return ( TValue )streamer.Deserialize( value );
		}
	}
}
